home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1997 #3 / Amiga Plus CD - 1997 - No. 03.iso / pd / programmierung / alienbreed3d2_src / cheesesauce / objectmove < prev    next >
Text File  |  1997-01-31  |  30KB  |  2,181 lines

  1. extlen: dc.w 0
  2. awayfromwall: dc.w 0
  3. wallbounce: dc.w 0
  4. wallxsize: dc.w 0
  5. wallzsize: dc.w 0
  6. walllength: dc.w 0
  7.  
  8. RoomPath: ds.w 100
  9. RoomPathPtr: dc.l 0
  10. QUITOUT: dc.w 0
  11.  
  12. MoveObject:
  13.  
  14.  move.l objroom,objroomback
  15.  move.w #200,QUITOUT
  16.  
  17.  move.l #RoomPath,RoomPathPtr
  18.  
  19.  clr.b hitwall
  20.  
  21.  move.w newx,d0
  22.  sub.w oldx,d0
  23.  move.w d0,xdiff
  24.  move.w newz,d0
  25.  sub.w oldz,d0
  26.  move.w d0,zdiff
  27.  tst.w xdiff
  28.  bne.s .moveing
  29.  tst.w zdiff
  30.  bne.s .moveing
  31.  rts
  32.  
  33. .moveing:
  34.  
  35.  move.l newy,wallhitheight
  36.  move.l objroom,a0
  37.  
  38. gobackanddoitallagain:
  39.  
  40.  move.l a0,a5
  41.  adda.w ToExitList(a5),a0
  42.  move.l a0,test
  43.  move.l FloorLines,a1
  44. checkwalls:
  45.  move.w (a0)+,d0
  46.  blt nomorewalls
  47.  
  48.  asl.w #4,d0
  49.  lea (a1,d0.w),a2
  50.  
  51. *********************************
  52. * Check if we are within exit limits
  53. * of zone.
  54. *********************************
  55.  
  56.  move.l #-65536*256,d0
  57.  move.l d0,LowerRoofHeight
  58.  move.l d0,UpperRoofHeight
  59.  move.l d0,LowerFloorHeight
  60.  move.l d0,UpperFloorHeight
  61.  
  62. ; tst.b 9(a2)
  63. ; bne thisisawall2
  64.  
  65.  moveq #0,d1
  66.  move.w 8(a2),d1
  67.  blt thisisawall2
  68.  move.l ZoneAdds,a4
  69.  move.l (a4,d1.w*4),a4
  70.  add.l LEVELDATA,a4
  71.  
  72.  move.l ToZoneFloor(a4),d1
  73.  move.l d1,LowerFloorHeight
  74.  move.l ToZoneRoof(a4),d2
  75.  move.l d2,LowerRoofHeight
  76.  
  77.  bra thisisawall1
  78.  
  79.  sub.l d2,d1
  80.  cmp.l thingheight,d1
  81.  ble thisisawall1
  82.  
  83.  move.l oldy,d0
  84.  move.l d0,d1
  85.  add.l thingheight,d1
  86.  sub.l ToZoneFloor(a4),d1
  87.  bgt.s chkstepup
  88.  
  89.  neg.l d1
  90.  cmp.l StepDownVal,d1
  91.  blt.s botinsidebot
  92.  
  93. chkstepup:
  94.  cmp.l StepUpVal,d1
  95.  blt.s botinsidebot
  96.  
  97. ; We have a wall!
  98.  bra thisisawall1
  99.  
  100. botinsidebot:
  101.  
  102.  sub.l ToZoneRoof(a4),d0
  103.  blt.s thisisawall1
  104.  
  105.  bra checkwalls
  106.  
  107. thisisawall1:
  108.  
  109.  move.l ToUpperFloor(a4),d1
  110.  move.l d1,UpperFloorHeight
  111.  move.l ToUpperRoof(a4),d2
  112.  sub.l d2,d1
  113.  move.l d2,UpperRoofHeight
  114.  
  115.  bra thisisawall2
  116.  
  117.  cmp.l thingheight,d1
  118.  ble thisisawall2
  119.  
  120.  move.l oldy,d0
  121.  move.l d0,d1
  122.  add.l thingheight,d1
  123.  sub.l ToUpperFloor(a4),d1
  124.  bgt.s chkstepup2
  125.  
  126.  neg.l d1
  127.  cmp.l StepDownVal,d1
  128.  blt.s botinsidebot2
  129.  bra.s thisisawall2
  130.  
  131. chkstepup2:
  132.  cmp.l StepUpVal,d1
  133.  blt.s botinsidebot2
  134.  
  135. ; We have a wall!
  136.  bra thisisawall2
  137.  
  138. botinsidebot2:
  139.  
  140.  sub.l ToUpperRoof(a4),d0
  141.  blt.s thisisawall2
  142.  
  143.  bra checkwalls
  144. thisisawall2
  145.  
  146.  move.l #0,a4
  147.  move.l #0,a6
  148.  move.b awayfromwall,d3
  149.  blt.s .notomatoes
  150.  
  151.  move.b 12(a2),d2
  152.  ext.w d2
  153.  
  154.  move.b 13(a2),d4
  155.  ext.w d4
  156.  
  157.  tst.b d3
  158.  beq.s .noshift
  159.  asl.w d3,d2
  160.  asl.w d3,d4
  161. .noshift
  162.  
  163.  move.w d2,a4
  164.  move.w d4,a6
  165.  
  166. .notomatoes:
  167.  
  168.  move.w newx,d0
  169.  move.w newz,d1
  170.  sub.w (a2),d0
  171.  sub.w 2(a2),d1
  172.  sub.w a4,d0
  173.  sub.w a6,d1
  174.  
  175.  move.w 4(a2),d2
  176.  sub.w a4,d2
  177.  sub.w a6,d2
  178.  
  179.  muls d2,d1
  180.  
  181.  move.w 6(a2),d5
  182.  add.w a4,d5
  183.  sub.w a6,d5
  184.  
  185.  muls d5,d0
  186.  sub.l d1,d0
  187.  ble chkhttt
  188.  
  189.  move.w 10(a2),d3
  190.  add.w extlen,d3
  191.  divs d3,d0
  192.  cmp.w #32,d0
  193.  bge oknothitwall
  194.  
  195.  move.w wallflags(pc),d0
  196.  or.w d0,14(a2) 
  197.  
  198.  bra oknothitwall
  199.  
  200. chkhttt:
  201.  
  202.  move.w d2,WALLXLEN
  203.  move.w d5,WALLZLEN
  204.  
  205.  move.l d0,d7
  206.  
  207.  move.w 10(a2),d3
  208.  add.w extlen,d3
  209.  divs d3,d7    ;  d
  210.  
  211.  move.l newy,d4
  212.  sub.l oldy,d4
  213. ; beq .dontworryhit
  214.  
  215.  move.w oldx,d0
  216.  move.w oldz,d1
  217.  sub.w (a2),d0
  218.  sub.w 2(a2),d1
  219.  sub.w a4,d0
  220.  sub.w a6,d1
  221.  
  222.  muls d2,d1
  223.  muls d5,d0
  224.  sub.l d1,d0
  225.  divs d3,d0    ; otherd
  226.  
  227.  sub.w d7,d0    ; total distance travelled across wall
  228.  bgt.s .ohbugger
  229.  moveq #1,d0
  230. .ohbugger:
  231.  
  232. ; We now have ratio to multiply x,z and y differences
  233. ; by. Check y=0 since that's quite common.
  234.  
  235.  move.l d4,d1
  236.  beq.s .dontworryhit
  237.  
  238.  divs d0,d1
  239.  muls d7,d1
  240. .dontworryhit:
  241.  add.l newy,d1 ; height at point of crossing wall.
  242.  move.l d1,d6
  243.  add.l thingheight,d6
  244.  sub.l StepUpVal,d6
  245.  
  246.  cmp.l LowerFloorHeight,d6
  247.  bge.s .yeshit
  248.  cmp.l LowerRoofHeight,d1
  249.  bgt oknothitwall
  250.  cmp.l UpperRoofHeight,d1
  251.  blt.s .yeshit
  252.  cmp.l UpperFloorHeight,d6
  253.  blt oknothitwall
  254.  
  255. .yeshit:
  256.  
  257.  move.l d1,wallhitheight
  258.  
  259.  tst.b wallbounce
  260.  bne.s .calcbounce
  261.  
  262.  tst.b exitfirst(pc)
  263.  beq.s .calcalong
  264.  bne.s .calcwherehit
  265.  
  266. .calcbounce:
  267.  
  268. ; For simplicity (possibility!) the
  269. ; bounce routine will:
  270. ; Place the object at wall contact
  271. ; point
  272. ; Supply wall data to reflect the
  273. ; movement direction of the object
  274.  
  275.  move.w d2,wallxsize
  276.  move.w d5,wallzsize
  277.  move.w d3,walllength
  278.  
  279. .calcwherehit:
  280.  
  281. ; add.w #20,d7
  282.  move.w newx,d6
  283.  sub.w oldx,d6
  284.  muls d7,d6
  285.  divs d0,d6
  286.  add.w newx,d6
  287.  
  288.  move.w newz,d1
  289.  sub.w oldz,d1
  290.  muls d7,d1
  291.  divs d0,d1
  292.  add.w newz,d1
  293.  move.w d6,d0
  294.  move.w d1,d7
  295.  bra.s .calcedhit
  296.  
  297. .calcalong:
  298.  
  299. ; sub.w #3,d7
  300.  move.w d7,d6
  301.  muls d5,d6
  302.  muls d2,d7
  303.  divs d3,d6
  304.  divs d3,d7
  305.  neg.w d6
  306.  add.w newx,d6    ; point on wall
  307.  add.w newz,d7
  308.  
  309.  move.w d6,d0
  310.  move.w d7,d1
  311.  bra.s othercheck
  312.  
  313. .calcedhit:
  314.  
  315.  move.w newx,d6
  316.  move.w newz,d7
  317.  sub.w oldx,d6
  318.  sub.w oldz,d7
  319.   
  320.  move.w (a2),d4
  321.  add.w a4,d4
  322.  sub.w oldx,d4
  323.  muls d4,d7; negative if on left
  324.  move.w 2(a2),d4
  325.  add.w a6,d4
  326.  sub.w oldz,d4
  327.  muls d4,d6
  328.  sub.l d6,d7
  329.  bgt oknothitwall
  330.  
  331.  move.w d0,d6
  332.  move.w d1,d7
  333.  move.w newx,d6
  334.  move.w newz,d7
  335.  sub.w oldx,d6
  336.  sub.w oldz,d7
  337.  
  338.  move.w (a2),d4
  339.  add.w a4,d4
  340.  add.w d2,d4
  341.  sub.w oldx,d4
  342.  muls d4,d7; negative if on left
  343.  move.w 2(a2),d4
  344.  add.w a6,d4
  345.  add.w d5,d4
  346.  sub.w oldz,d4
  347.  muls d4,d6
  348.  sub.l d6,d7
  349.  blt oknothitwall
  350.  bra hitthewall
  351.  
  352.  
  353. othercheck:
  354.  
  355. ; sub.w (a2),d6
  356. ; sub.w 2(a2),d7
  357. ; sub.w a4,d6
  358. ; sub.w a6,d7
  359. ; muls d6,d6
  360. ; muls d7,d7
  361. ; add.w #5,d3
  362. ; muls d3,d3
  363. ; add.l d6,d7
  364. ; cmp.l d3,d7
  365. ; bgt oknothitwall
  366. ; move.w d1,d7
  367. ; move.w d0,d6
  368. ; sub.w (a2),d6
  369. ; sub.w 2(a2),d7
  370. ; sub.w d2,d6
  371. ; sub.w d5,d7
  372. ; muls d6,d6
  373. ; muls d7,d7
  374. ; add.l d6,d7
  375. ; cmp.l d3,d7
  376. ; bgt oknothitwall
  377. ;************8 
  378.  
  379.  sub.w (a2),d6
  380.  sub.w 2(a2),d7
  381.  
  382.  sub.w a4,d6
  383.  sub.w a6,d7
  384.  move.w d2,d4
  385.  bge.s okplus1
  386.  neg.w d4
  387. okplus1
  388.  move.w d5,d3
  389.  bge.s okplus2
  390.  neg.w d3
  391. okplus2:
  392.  cmp.w d4,d3
  393.  bgt.s UseZ
  394.  
  395. ; Use the x coord!
  396.  
  397.  tst.w d6
  398.  bgt.s xispos
  399.  
  400.  move.w d2,d7
  401.  cmp.w #4,d7
  402.  bgt.s oknothitwall
  403.  sub.w #4,d7
  404.  cmp.w d7,d6
  405.  blt.s oknothitwall
  406.  
  407.  bra.s hitthewall
  408.  
  409. xispos:
  410.  
  411.  move.w d2,d7
  412.  cmp.w #-4,d7
  413.  blt.s oknothitwall
  414.  add.w #4,d7
  415.  cmp.w d7,d6
  416.  bgt.s oknothitwall
  417.  
  418.  bra.s hitthewall
  419.  
  420. UseZ:
  421.  tst.w d7
  422.  bgt.s zispos
  423.  
  424.  move.w d5,d6
  425.  cmp.w #4,d6
  426.  bgt.s oknothitwall
  427.  sub.w #4,d6
  428.  cmp.w d6,d7
  429.  blt.s oknothitwall
  430.  
  431.  bra.s hitthewall
  432.  
  433. zispos:
  434.  
  435.  move.w d5,d6
  436.  cmp.w #-4,d6
  437.  blt.s oknothitwall
  438.  add.w #4,d6
  439.  cmp.w d6,d7
  440.  bgt.s oknothitwall 
  441.  
  442. hitthewall:
  443.  
  444.  move.w d0,newx
  445.  move.w d1,newz
  446.  move.w wallflags(pc),d0
  447.  or.w d0,14(a2)
  448.  st hitwall
  449.  tst.b exitfirst(pc)
  450.  bne stopandleave
  451.  
  452. oknothitwall:
  453.  
  454.  bra checkwalls
  455. nomorewalls:
  456.  
  457.  tst.w extlen
  458.  beq NOOTHERWALLSNEEDED
  459.  
  460.  tst.w xdiff
  461.  bne.s notstill
  462.  tst.w zdiff
  463.  bne.s notstill
  464.  move.l objroom,a0
  465.  bra mustbeinsameroom
  466. notstill:
  467.  
  468.  move.l a5,a0
  469.  add.w ToExitList(a0),a0
  470.  
  471. checkotherwalls:
  472.  move.w (a0)+,d0
  473.  bge anotherwalls
  474.  cmp.w #-2,d0
  475.  beq nomoreotherwalls
  476.  bra checkotherwalls
  477.  
  478. anotherwalls:
  479.  
  480.  asl.w #4,d0
  481.  lea (a1,d0.w),a2
  482.  
  483. *********************************
  484. * Check if we are within exit limits
  485. * of zone.
  486. *********************************
  487.  
  488. ; tst.b 9(a2)
  489. ; bne .thisisawall2
  490.  
  491.  moveq #0,d1
  492.  move.w 8(a2),d1
  493.  blt .thisisawall2
  494.  move.l ZoneAdds,a4
  495.  move.l (a4,d1.w*4),a4
  496.  add.l LEVELDATA,a4
  497.  
  498.  move.l ToZoneFloor(a4),d1
  499.  sub.l ToZoneRoof(a4),d1
  500.  cmp.l thingheight,d1
  501.  ble .thisisawall1
  502.  
  503.  move.l newy,d0
  504.  move.l d0,d1
  505.  add.l thingheight,d1
  506.  sub.l ToZoneFloor(a4),d1
  507.  bgt.s .chkstepup
  508.  
  509.  neg.l d1
  510.  cmp.l StepDownVal,d1
  511.  blt.s .botinsidebot
  512.  bra.s .thisisawall1
  513.  
  514. .chkstepup:
  515.  
  516.  cmp.l StepUpVal,d1
  517.  blt.s .botinsidebot
  518.  
  519. ; We have a wall!
  520.  bra .thisisawall1
  521.  
  522. .botinsidebot:
  523.  
  524.  sub.l ToZoneRoof(a4),d0
  525.  blt.s .thisisawall1
  526.  
  527.  bra checkotherwalls
  528.  
  529. .thisisawall1:
  530.  
  531.  move.l ToUpperFloor(a4),d1
  532.  sub.l ToUpperRoof(a4),d1
  533.  cmp.l thingheight,d1
  534.  ble .thisisawall2
  535.  
  536.  move.l newy,d0
  537.  move.l d0,d1
  538.  add.l thingheight,d1
  539.  sub.l ToUpperFloor(a4),d1
  540.  bgt.s .chkstepup2
  541.  
  542.  neg.l d1
  543.  cmp.l StepDownVal,d1
  544.  blt.s .botinsidebot2
  545.  bra.s .thisisawall2
  546.  
  547. .chkstepup2:
  548.  
  549.  cmp.l StepUpVal,d1
  550.  blt.s .botinsidebot2
  551.  
  552. ; We have a wall!
  553.  bra .thisisawall2
  554.  
  555. .botinsidebot2:
  556.  
  557.  sub.l ToUpperRoof(a4),d0
  558.  blt.s .thisisawall2
  559.  
  560.  bra checkotherwalls
  561.  
  562. .thisisawall2:
  563.  
  564.  move.l #0,a4
  565.  move.l #0,a6
  566.  move.b awayfromwall,d3
  567.  blt.s .notomatoes
  568.  
  569.  move.b 12(a2),d2
  570.  ext.w d2
  571.  
  572.  move.b 13(a2),d4
  573.  ext.w d4
  574.  
  575.  tst.b d3
  576.  beq.s .noshift
  577.  asl.w d3,d2
  578.  asl.w d3,d4
  579. .noshift
  580.  
  581.  move.w d2,a4
  582.  move.w d4,a6
  583.  
  584. .notomatoes:
  585.  
  586.  move.w 4(a2),d2
  587.  sub.w a4,d2
  588.  sub.w a6,d2
  589.  move.w d2,DX
  590.  move.w 6(a2),d5
  591.  add.w a4,d5
  592.  sub.w a6,d5
  593.  
  594.  
  595.  move.w newx,d0
  596.  move.w newz,d1
  597.  sub.w (a2),d0
  598.  sub.w 2(a2),d1
  599.  sub.w a4,d0
  600.  sub.w a6,d1
  601.  muls DX,d1
  602.  muls d5,d0
  603.  sub.l d1,d0
  604.  bge .oknothitwall
  605.  move.l d0,d7
  606.  
  607.  move.w oldx,d1
  608.  move.w newx,d3
  609.  sub.w d1,d3
  610.  sub.w (a2),d1
  611.  sub.w a4,d1 ;e-a=d1
  612.  
  613.  move.w 2(a2),d2
  614.  add.w a6,d2
  615.  sub.w oldz,d2    ;b-f=d2
  616.  
  617.  move.w newz,d4
  618.  sub.w oldz,d4
  619.  
  620.  muls d4,d1
  621.  muls d3,d2
  622.  add.l d2,d1    ; h(e-a)+g(b-f)
  623.  
  624.  muls DX,d4
  625.  muls d5,d3
  626.  sub.l d3,d4
  627.  beq .oknothitwall
  628.  bgt.s .botpos
  629. .botneg:
  630.  tst.l d1
  631.  bgt .oknothitwall
  632.  cmp.l d1,d4
  633.  ble .mighthit
  634.  bra .oknothitwall
  635.  
  636. .botpos:
  637.  tst.l d1
  638.  blt .oknothitwall
  639.  cmp.l d1,d4
  640.  blt .oknothitwall
  641.  
  642. .mighthit:
  643.  
  644.  move.w 10(a2),d0
  645.  add.w extlen,d0
  646.  divs d0,d7    ;  d
  647.  sub.w #3,d7
  648.  move.w d7,d6
  649.  muls d5,d6
  650.  muls DX,d7
  651.  divs d0,d6
  652.  divs d0,d7
  653.  neg.w d6
  654.  add.w newx,d6    ; point on wall
  655.  add.w newz,d7
  656.  
  657.  move.w oldx,d0
  658.  move.w oldz,d1
  659.  sub.w (a2),d0
  660.  sub.w 2(a2),d1
  661.  sub.w a4,d0
  662.  sub.w a6,d1
  663.  muls DX,d1
  664.  muls d5,d0
  665.  sub.l d1,d0
  666.  blt .oknothitwall
  667.  
  668.  move.w d6,d0
  669.  move.w d7,d1
  670.  
  671.  bra .hitthewall
  672.  
  673.  sub.w (a2),d6
  674.  sub.w 2(a2),d7
  675.  move.w d6,d4
  676.  bge.s .okplus1
  677.  neg.w d4
  678. .okplus1
  679.  move.w d7,d3
  680.  bge.s .okplus2
  681.  neg.w d3
  682. .okplus2:
  683.  cmp.w d4,d3
  684.  bgt.s .UseZ
  685.  
  686. ; Use the x coord!
  687.  
  688.  tst.w d6
  689.  bgt.s .xispos
  690.  
  691.  move.w DX,d7
  692.  bgt.s .oknothitwall
  693.  cmp.w d7,d6
  694.  blt.s .oknothitwall
  695.  
  696.  bra.s .hitthewall
  697.  
  698. .xispos:
  699.  
  700.  move.w DX,d7
  701.  blt.s .oknothitwall
  702.  cmp.w d7,d6
  703.  bgt.s .oknothitwall
  704.  
  705.  bra.s .hitthewall
  706.  
  707. .UseZ:
  708.  tst.w d7
  709.  bgt.s .zispos
  710.  
  711.  move.w d5,d6
  712.  bgt.s .oknothitwall
  713.  cmp.w d6,d7
  714.  blt.s .oknothitwall
  715.  
  716.  bra.s .hitthewall
  717.  
  718. .zispos:
  719.  
  720.  move.w d5,d6
  721.  blt.s .oknothitwall
  722.  cmp.w d6,d7
  723.  bgt.s .oknothitwall
  724.  
  725.  
  726. .hitthewall:
  727.  
  728.  move.w d0,newx
  729.  move.w d1,newz
  730.  move.w wallflags(pc),d0
  731.  or.w d0,14(a2)
  732.  st hitwall
  733.  tst.b exitfirst(pc)
  734.  bne stopandleave
  735.  
  736. .oknothitwall:
  737.  
  738.  bra checkotherwalls
  739. nomoreotherwalls:
  740.  
  741. NOOTHERWALLSNEEDED
  742.  
  743.  
  744. ; move.w xdiff,d2
  745. ; muls d2,d2
  746. ; move.w zdiff,d3
  747. ; muls d3,d3
  748. ; move.w #0,movespd
  749. ; move.l #0,largespd
  750. ; add.l d3,d2
  751. ;
  752. ; move.w #31,d0
  753. ;.findhigh
  754. ; btst d0,d2
  755. ; bne .foundhigh
  756. ; dbra d0,.findhigh
  757. ;.foundhigh
  758. ; asr.w #1,d0
  759. ; clr.l d3
  760. ; bset d0,d3
  761. ; move.l d3,d0
  762. ;
  763. ; move.w d0,d3
  764. ; muls d3,d3    ; x*x
  765. ; sub.l d2,d3    ; x*x-a
  766. ; asr.l #1,d3    ; (x*x-a)/2
  767. ; divs d0,d3    ; (x*x-a)/2x
  768. ; sub.w d3,d0    ; second approx
  769. ; bgt .stillnot0
  770. ; move.w #1,d0
  771. ;.stillnot0
  772. ;
  773. ; move.w d0,d3
  774. ; muls d3,d3
  775. ; sub.l d2,d3
  776. ; asr.l #1,d3
  777. ; divs d0,d3
  778. ; sub.w d3,d0    ; second approx
  779. ; bgt .stillnot02
  780. ; move.w #1,d0
  781. ;.stillnot02
  782. ;
  783. ; move.w d0,movespd
  784. ;.moving
  785. ; ext.l d0
  786. ; asl.l #5,d0
  787. ; move.l d0,largespd
  788.  
  789. *****************************************************
  790. * FIND ROOM WE'RE STANDING IN ***********************
  791. *****************************************************
  792.  
  793.  move.l a5,a0
  794.  adda.w ToExitList(a5),a0
  795.  
  796.  move.l FloorLines,a1
  797. CheckMoreFloorLines
  798.  move.w (a0)+,d0    ; Either a floor line or -1
  799.  blt NoMoreFloorLines
  800.  asl.w #4,d0
  801.  lea (a1,d0.w),a2
  802.  
  803.  tst.w 8(a2)
  804.  blt.s CheckMoreFloorLines
  805.  
  806.  clr.b CrossIntoTop
  807.  
  808.  moveq #0,d1
  809.  move.w 8(a2),d1
  810.  move.l ZoneAdds,a4
  811.  move.l (a4,d1.w*4),a4
  812.  add.l LEVELDATA,a4
  813.  
  814.  move.l ToZoneRoof(a4),LowerRoofHeight
  815.  
  816. ; move.l newy,d0
  817. ; move.l d0,d1
  818. ; add.l thingheight,d1
  819. ;
  820. ; sub.l ToZoneRoof(a4),d0
  821. ; blt.s NOTINLOWER
  822. ; sub.l ToZoneFloor(a4),d1
  823. ; blt.s okthebottom
  824. ;
  825. ; cmp.l StepUpVal,d1
  826. ; bgt.s NOTINLOWER
  827. ;
  828. ; move.l ToZoneFloor(a4),d1
  829. ; sub.l thingheight,d1
  830. ; move.l d1,newy
  831. ; bra okthebottom
  832. ;
  833. ;NOTINLOWER:
  834. ;
  835. ; move.l ToZoneRoof(a4),billy
  836. ; move.l ToZoneRoof(a4),billy+4
  837. ; add.l d0,billy+4
  838. ;
  839. ; st CrossIntoTop
  840. ; move.l newy,d0
  841. ; move.l d0,d1
  842. ; add.l thingheight,d1
  843. ; sub.l ToUpperRoof(a4),d0
  844. ; blt CheckMoreFloorLines
  845. ; sub.l ToUpperFloor(a4),d1
  846. ; blt.s okthebottom
  847. ;
  848. ; cmp.l StepUpVal,d1
  849. ; bgt CheckMoreFloorLines
  850.  
  851. ; move.l ToUpperFloor(a4),d1
  852. ; sub.l thingheight,d1
  853. ; move.l d1,newy
  854.  
  855. okthebottom
  856.  
  857.  move.w newx,d0
  858.  move.w newz,d1
  859.  sub.w (a2),d0    ;a
  860.  sub.w 2(a2),d1    ;b
  861.  muls 4(a2),d1
  862.  muls 6(a2),d0
  863.  moveq #0,d3
  864.  move.w 8(a2),d3
  865.  move.l ZoneAdds,a3
  866.  move.l (a3,d3.w*4),a3
  867.  add.l LEVELDATA,a3
  868.  sub.l d1,d0
  869.  bge StillSameSide
  870.  
  871. * Player is now on the left side of this line.
  872. * Where was he before?
  873.  
  874. ; cmp.l a4,a5
  875. ; bne StillSameSide
  876.  
  877. ; move.w oldx,d0
  878. ; move.w oldz,d1
  879. ; sub.w (a2),d0    ;a
  880. ; sub.w 2(a2),d1    ;b
  881. ; muls 4(a2),d1
  882. ; muls 6(a2),d0
  883. ; sub.l d1,d0
  884. ; blt StillSameSide
  885. ; bra checkifcrossed
  886.  
  887. OnRightsideofline:
  888. * Player is now on the right side of the line.
  889. * Where was he last time?
  890.  
  891. ; exg a3,a4
  892.  
  893. ; cmp.l a3,a5
  894. ; bne StillSameSide
  895.  
  896. ; move.w oldx,d0
  897. ; move.w oldz,d1
  898. ; sub.w (a2),d0    ;a
  899. ; sub.w 2(a2),d1    ;b
  900. ; muls 4(a2),d1
  901. ; muls 6(a2),d0
  902. ; sub.l d1,d0
  903. ; bgt StillSameSide
  904.  
  905. checkifcrossed:
  906.  
  907. *Player used to be on other side of this line.
  908. *Need to check if he crossed it.
  909.  
  910.  move.l d0,billy
  911.  
  912.  move.w newx,d6
  913.  move.w newz,d7
  914.  sub.w oldx,d6
  915.  sub.w oldz,d7
  916.   
  917.  move.w (a2),d4
  918.  sub.w oldx,d4
  919.  muls d4,d7; negative if on left
  920.  move.w 2(a2),d4
  921.  sub.w oldz,d4
  922.  muls d4,d6
  923.  sub.l d6,d7
  924.  bgt StillSameSide
  925.  
  926.  move.w d0,d6
  927.  move.w d1,d7
  928.  move.w newx,d6
  929.  move.w newz,d7
  930.  sub.w oldx,d6
  931.  sub.w oldz,d7
  932.  
  933.  move.w (a2),d4
  934.  add.w 4(a2),d4
  935.  sub.w oldx,d4
  936.  muls d4,d7; negative if on left
  937.  move.w 2(a2),d4
  938.  add.w 6(a2),d4
  939.  sub.w oldz,d4
  940.  muls d4,d6
  941.  sub.l d6,d7
  942.  blt StillSameSide
  943.  
  944. ; Find height at crossing point:
  945.  
  946.  move.l billy,d7
  947.  divs 10(a2),d7
  948.  move.w oldx,d0
  949.  move.w oldz,d1
  950.  sub.w (a2),d0
  951.  sub.w 2(a2),d1
  952.  
  953.  muls 4(a2),d1
  954.  muls 6(a2),d0
  955.  sub.l d1,d0
  956.  divs 10(a2),d0 
  957.  
  958.  sub.w d7,d0
  959.  bgt.s .ohbugger
  960.  moveq #1,d0
  961. .ohbugger:
  962.  
  963.  
  964.  move.l newy,d4
  965.  sub.l oldy,d4
  966.  divs d0,d4
  967.  muls d7,d4
  968.  add.l newy,d4
  969.  
  970.  cmp.l LowerRoofHeight,d4
  971.  slt StoodInTop
  972.  
  973.  move.l a3,a5
  974.  move.l RoomPathPtr,a0
  975.  move.w (a3),(a0)+
  976.  move.l a0,RoomPathPtr
  977.  move.l a3,a0
  978.  move.l a5,objroom
  979.  
  980.  move.w QUITOUT,d0
  981.  sub.w #1,d0
  982.  beq.s ERRORINMOVEMENT
  983.  move.w d0,QUITOUT
  984.  bra gobackanddoitallagain
  985. ; bra.s donefloorline
  986.  
  987. StillSameSide:
  988. donefloorline:
  989.  
  990.  bra CheckMoreFloorLines
  991. NoMoreFloorLines:
  992.  
  993.  move.l a5,a0
  994.  move.l a5,objroom
  995.  
  996. mustbeinsameroom:
  997.  
  998. stopandleave:
  999.  
  1000.  move.l RoomPathPtr,a0
  1001.  move.w #-1,(a0)+
  1002.  
  1003.  rts
  1004.  
  1005. ERRORINMOVEMENT:
  1006.  move.w oldx,newx
  1007.  move.w oldz,newz
  1008.  move.l oldy,newy
  1009.  move.l objroomback,objroom
  1010.  st hitwall
  1011.  rts
  1012.  
  1013. objroomback: dc.l 0
  1014.  
  1015. DX: dc.w 0
  1016.  
  1017. tstxval: dc.l 0
  1018. oldx: dc.l 0
  1019. oldz: dc.l 0
  1020. newx: dc.l 0
  1021. newz: dc.l 0
  1022. xdiff: dc.l 0
  1023. zdiff: dc.l 0
  1024. objroom: dc.l 0
  1025. hitwall: dc.b 0
  1026. exitfirst: dc.b 0
  1027. speed: dc.w 0
  1028. wallflags: dc.w 0
  1029. distaway: dc.w 0
  1030. newy: dc.l 0
  1031. oldy: dc.l 0
  1032. thingheight: dc.l 0
  1033. StepUpVal: dc.l 0
  1034. StepDownVal: dc.l 0
  1035. wallhitheight: dc.l 0
  1036. seclot: dc.b 0
  1037.  
  1038.  even
  1039. WALLXLEN: dc.w 0
  1040. WALLZLEN: dc.w 0
  1041. onwallx: dc.w 0
  1042. onwallz: dc.w 0
  1043. slidex: dc.w 0
  1044. slidez: dc.w 0
  1045. CrossIntoTop: dc.b 0
  1046. StoodInTop: dc.b 0
  1047. LowerFloorHeight: dc.l 0
  1048. LowerRoofHeight: dc.l 0
  1049. UpperFloorHeight: dc.l 0
  1050. UpperRoofHeight: dc.l 0
  1051.  
  1052. billy: dc.l 0,0
  1053.  
  1054.  even
  1055.  
  1056. HeadTowards:
  1057.  
  1058.  move.w newx,d1
  1059.  sub.w oldx,d1
  1060.  move.w d1,xdiff
  1061.  move.w newz,d2
  1062.  sub.w oldz,d2
  1063.  move.w d2,zdiff
  1064.  muls d1,d1
  1065.  muls d2,d2
  1066.  move.w #0,d0
  1067.  move.w d0,distaway
  1068.  add.l d1,d2
  1069.  beq nochange
  1070.  
  1071.  move.w #31,d0
  1072. .findhigh
  1073.  btst d0,d2
  1074.  bne .foundhigh
  1075.  dbra d0,.findhigh
  1076. .foundhigh
  1077.  asr.w #1,d0
  1078.  clr.l d3
  1079.  bset d0,d3
  1080.  move.l d3,d0
  1081.  
  1082.  move.w d0,d1
  1083.  muls d1,d1    ; x*x
  1084.  sub.l d2,d1    ; x*x-a
  1085.  asr.l #1,d1    ; (x*x-a)/2
  1086.  divs d0,d1    ; (x*x-a)/2x
  1087.  sub.w d1,d0    ; second approx
  1088.  bgt .stillnot0
  1089.  move.w #1,d0
  1090. .stillnot0
  1091.  
  1092.  move.w d0,d1
  1093.  muls d1,d1
  1094.  sub.l d2,d1
  1095.  asr.l #1,d1
  1096.  divs d0,d1
  1097.  sub.w d1,d0    ; second approx
  1098.  bgt .stillnot02
  1099.  move.w #1,d0
  1100. .stillnot02
  1101.  
  1102.  move.w d0,distaway
  1103.  
  1104. ; d0=perpdist
  1105.  
  1106.  cmp.w Range,d0
  1107.  sle GotThere
  1108.  bgt.s faraway
  1109.  
  1110.  move.w xdiff,d1
  1111.  move.w zdiff,d2
  1112.  muls Range,d1
  1113.  muls Range,d2
  1114.  divs d0,d1
  1115.  divs d0,d2
  1116.  neg.w d1
  1117.  neg.w d2
  1118.  add.w d1,newx
  1119.  add.w d2,newz
  1120.  bra nochange
  1121.  
  1122. faraway:
  1123.  move.w speed,d3
  1124.  add.w Range,d3
  1125.  cmp.w d0,d3
  1126.  blt.s .notoofast
  1127.  move.w d0,d3
  1128.  st GotThere
  1129. .notoofast:
  1130.  sub.w Range,d3
  1131.  
  1132.  move.w xdiff,d1
  1133.  muls d3,d1
  1134.  divs d0,d1
  1135.  move.w zdiff,d2
  1136.  muls d3,d2
  1137.  divs d0,d2
  1138.  add.w oldx,d1
  1139.  move.w d1,newx
  1140.  add.w oldz,d2
  1141.  move.w d2,newz
  1142.  
  1143. nochange:
  1144.  
  1145.  rts
  1146.  
  1147.  
  1148. CalcDist:
  1149.  
  1150.  move.w newx,d1
  1151.  sub.w oldx,d1
  1152.  move.w d1,xdiff
  1153.  move.w newz,d2
  1154.  sub.w oldz,d2
  1155.  move.w d2,zdiff
  1156.  muls d1,d1
  1157.  muls d2,d2
  1158.  move.w #0,d0
  1159.  move.w d0,distaway
  1160.  add.l d1,d2
  1161.  beq .nochange
  1162.  
  1163.  move.w #31,d0
  1164. .findhigh
  1165.  btst d0,d2
  1166.  bne .foundhigh
  1167.  dbra d0,.findhigh
  1168. .foundhigh
  1169.  asr.w #1,d0
  1170.  clr.l d3
  1171.  bset d0,d3
  1172.  move.l d3,d0
  1173.  
  1174.  move.w d0,d1
  1175.  muls d1,d1    ; x*x
  1176.  sub.l d2,d1    ; x*x-a
  1177.  asr.l #1,d1    ; (x*x-a)/2
  1178.  divs d0,d1    ; (x*x-a)/2x
  1179.  sub.w d1,d0    ; second approx
  1180.  bgt .stillnot0
  1181.  move.w #1,d0
  1182. .stillnot0
  1183.  
  1184.  move.w d0,d1
  1185.  muls d1,d1
  1186.  sub.l d2,d1
  1187.  asr.l #1,d1
  1188.  divs d0,d1
  1189.  sub.w d1,d0    ; second approx
  1190.  bgt .stillnot02
  1191.  move.w #1,d0
  1192. .stillnot02
  1193.  
  1194.  move.w d0,distaway
  1195. .nochange:
  1196.  
  1197.  rts
  1198.  
  1199.  
  1200. counterer: dc.w 0
  1201. CosRet: dc.w 0
  1202. SinRet: dc.w 0
  1203.  
  1204. HeadTowardsAng:
  1205.  
  1206.  move.w newx,d1
  1207.  sub.w oldx,d1
  1208.  move.w d1,xdiff
  1209.  move.w newz,d2
  1210.  sub.w oldz,d2
  1211.  move.w d2,zdiff
  1212.  muls d1,d1
  1213.  muls d2,d2
  1214.  move.w #0,d0
  1215.  add.l d1,d2
  1216.  seq GotThere
  1217.  beq .nochange
  1218.  
  1219.  move.w #31,d0
  1220. .findhigh
  1221.  btst d0,d2
  1222.  bne .foundhigh
  1223.  dbra d0,.findhigh
  1224. .foundhigh
  1225.  asr.w #1,d0
  1226.  clr.l d3
  1227.  bset d0,d3
  1228.  move.l d3,d0
  1229.  
  1230.  move.w d0,d1
  1231.  muls d1,d1    ; x*x
  1232.  sub.l d2,d1    ; x*x-a
  1233.  asr.l #1,d1    ; (x*x-a)/2
  1234.  divs d0,d1    ; (x*x-a)/2x
  1235.  sub.w d1,d0    ; second approx
  1236.  bgt .stillnot0
  1237.  move.w #1,d0
  1238. .stillnot0
  1239.  
  1240.  move.w d0,d1
  1241.  muls d1,d1
  1242.  sub.l d2,d1
  1243.  asr.l #1,d1
  1244.  divs d0,d1
  1245.  sub.w d1,d0    ; second approx
  1246.  bgt .stillnot02
  1247.  move.w #1,d0
  1248. .stillnot02
  1249.  
  1250.  move.w d0,d1
  1251.  muls d1,d1
  1252.  sub.l d2,d1
  1253.  asr.l #1,d1
  1254.  divs d0,d1
  1255.  sub.w d1,d0    ; second approx
  1256.  bgt .stillnot03
  1257.  move.w #1,d0
  1258. .stillnot03
  1259.  
  1260.  
  1261. ; d0=perpdist
  1262.  
  1263.  cmp.w Range,d0
  1264.  sle GotThere
  1265.  bgt .faraway
  1266.  
  1267.  move.w oldx,newx
  1268.  move.w oldz,newz
  1269.  bra .nochange
  1270.  
  1271.  move.w xdiff,d1
  1272.  move.w zdiff,d2
  1273.  muls Range,d1
  1274.  muls Range,d2
  1275.  addq #3,d0
  1276.  divs d0,d1
  1277.  divs d0,d2
  1278.  subq #3,d0
  1279.  neg.w d1
  1280.  neg.w d2
  1281.  add.w d1,newx
  1282.  add.w d2,newz
  1283.  tst.b canshove
  1284.  beq .nochange
  1285.  move.w PLR1_opushx(pc),d1
  1286.  add.w PLR2_opushx(pc),d1
  1287.  sub.w d1,newx
  1288.  move.w PLR1_opushz(pc),d1
  1289.  add.w PLR2_opushz(pc),d1
  1290.  sub.w d1,newz
  1291.  move.w xdiff,d1
  1292.  move.w zdiff,d2
  1293.  move.w Range,d3
  1294.  sub.w d0,d3
  1295.  muls d3,d1
  1296.  muls d3,d2
  1297.  divs d0,d1
  1298.  divs d0,d2
  1299.  move.w d1,shovex
  1300.  move.w d2,shovez
  1301.  bra .nochange
  1302.  
  1303. .faraway:
  1304.  
  1305.  move.w speed,d3
  1306.  add.w Range,d3
  1307.  cmp.w d0,d3
  1308.  blt.s .notoofast
  1309.  move.w d0,d3
  1310.  st GotThere
  1311. .notoofast:
  1312.  sub.w Range,d3
  1313.  
  1314.  move.w xdiff,d1
  1315.  muls d3,d1
  1316.  divs d0,d1
  1317.  move.w zdiff,d2
  1318.  muls d3,d2
  1319.  divs d0,d2
  1320.  add.w oldx,d1
  1321.  move.w d1,newx
  1322.  add.w oldz,d2
  1323.  move.w d2,newz
  1324.  
  1325. .nochange:
  1326.  
  1327.  tst.w d0
  1328.  beq.s nocossin
  1329.  
  1330.  add.w #1,d0
  1331.  move.w xdiff,d1
  1332.  swap d1
  1333.  clr.w d1
  1334.  asr.l #1,d1
  1335.  divs d0,d1
  1336.  move.w d1,SinRet
  1337.  move.w zdiff,d1
  1338.  swap d1
  1339.  clr.w d1
  1340.  asr.l #1,d1
  1341.  divs d0,d1
  1342.  move.w d1,CosRet
  1343.  
  1344.  move.w SinRet,d0
  1345.  move.w #0,d2
  1346.  move.l #SineTable,a2
  1347.  lea 2048(a2),a3
  1348.  move.w #3,d5
  1349.  move.w #2048,d6
  1350. findanglop:
  1351.  
  1352.  move.w (a2,d2.w*2),d3
  1353.  move.w (a3,d2.w*2),d4
  1354.  muls d0,d4
  1355.  muls d1,d3
  1356.  sub.l d3,d4
  1357.  blt.s subang
  1358.  add.w d6,d2
  1359.  add.w d6,d2
  1360. subang:
  1361.  sub.w d6,d2
  1362.  and.w #4095,d2
  1363.  asr.w #1,d6
  1364.  dbra d5,findanglop
  1365.  add.w d2,d2
  1366.  move.w d2,AngRet
  1367.  
  1368. nocossin:
  1369.  
  1370.  rts
  1371.  
  1372. AngRet: dc.w 0
  1373. Range: dc.w 0
  1374. GotThere: dc.w 0
  1375. shovex: dc.w 0
  1376. shovez: dc.w 0
  1377. canshove: dc.w 0
  1378. PLR2_pushx: dc.l 0
  1379. PLR2_pushz: dc.l 0
  1380. PLR2_opushx: dc.l 0
  1381. PLR2_opushz: dc.l 0
  1382. PLR1_pushx: dc.l 0
  1383. PLR1_pushz: dc.l 0
  1384. PLR1_opushx: dc.l 0
  1385. PLR1_opushz: dc.l 0
  1386.  
  1387. CheckHit:
  1388.  move.w newx,d0
  1389.  sub.w oldx,d0
  1390.  move.w newz,d1
  1391.  sub.w oldz,d1
  1392.  muls d1,d1
  1393.  muls d0,d0
  1394.  add.l d0,d1
  1395.  cmp.l d2,d1
  1396.  slt hitwall
  1397.  rts
  1398.  
  1399. ONLYSEE: dc.w 0
  1400.  
  1401. GetNextCPt:
  1402.  
  1403.  clr.b ONLYSEE
  1404.  cmp.w d0,d1
  1405.  beq.s noneedforhassle
  1406.  muls.w #100,d0
  1407.  ext.l d1
  1408.  add.l d1,d0
  1409.  move.l a0,-(a7)
  1410.  
  1411.  move.l LINKS,a0
  1412.  tst.b FLYABIT
  1413.  beq.s .walklink
  1414.  move.l FLYLINKS,a0
  1415. .walklink: 
  1416.  move.b (a0,d0.w),d0
  1417.  move.b d0,d1
  1418.  and.b #$7f,d0
  1419.  and.b #$80,d1
  1420.  sne ONLYSEE
  1421.  ext.w d0
  1422.  move.l (a7)+,a0
  1423. noneedforhassle:
  1424.  rts
  1425.  
  1426. FromRoom: dc.l 0
  1427. ToRoom: dc.l 0
  1428. CanSee: dc.w 0
  1429. Facedir: dc.w 0
  1430.  
  1431.  even
  1432.  
  1433. CanItBeSeenAng:
  1434.  movem.l d0-d7/a0-a6,-(a7)
  1435.  
  1436.  move.w Facedir,d0
  1437.  move.l #SineTable,a0
  1438.  add.w d0,a0
  1439.  move.w (a0),d0
  1440.  move.w 2048(a0),d1
  1441.  move.w Targetx,d2
  1442.  sub.w Viewerx,d2
  1443.  move.w Targetz,d3
  1444.  sub.w Viewerz,d3
  1445.  muls d1,d2
  1446.  muls d0,d3
  1447.  sub.l d3,d2
  1448.  bgt.s ItMightBeSeen
  1449.  clr.b CanSee
  1450.  movem.l (a7)+,d0-a7/a0-a6
  1451.  rts
  1452. ItMightBeSeen:
  1453.  
  1454.  move.l ToRoom,a0
  1455.  move.w (a0),d0
  1456.  move.l FromRoom,a0
  1457.  adda.w #ToListOfGraph,a0
  1458.  bra.s InList
  1459.  
  1460. Viewerx: dc.l 0
  1461. Viewerz: dc.l 0
  1462. Targetx: dc.l 0
  1463. Targetz: dc.l 0
  1464. ViewerTop: dc.b 0
  1465. TargetTop: dc.b 0 
  1466. Viewery: dc.w 0
  1467. Targety: dc.w 0
  1468.  
  1469.   even
  1470.  
  1471. insameroom:
  1472.  st CanSee
  1473.  move.b ViewerTop,d0
  1474.  move.b TargetTop,d1
  1475.  eor.b d0,d1
  1476.  bne outlist
  1477.  movem.l (a7)+,d0-d7/a0-a6
  1478.  rts
  1479.  
  1480. CanItBeSeen:
  1481.  
  1482.  
  1483.  movem.l d0-d7/a0-a6,-(a7)
  1484.  move.l ToRoom,a1
  1485.  move.w (a1),d0
  1486.  move.l FromRoom,a0
  1487.  cmp.l a0,a1
  1488.  beq.s insameroom
  1489.  
  1490.  adda.w #ToListOfGraph,a0
  1491.  
  1492. InList:
  1493.  move.w (a0),d1
  1494.  tst.w d1
  1495.  blt outlist
  1496.  move.l ZoneGraphAdds,a1
  1497.  move.l (a1,d1.w*8),a1
  1498.  add.l LEVELGRAPHICS,a1
  1499.  
  1500.  adda.w #8,a0
  1501.  cmp.w (a1),d0
  1502.  beq isinlist
  1503.  
  1504.  bra.s InList
  1505.  
  1506. isinlist:
  1507. ; We have found the dest room in the
  1508. ; list of rooms visible from the
  1509. ; source room.
  1510.  
  1511. ; Do line of sight!
  1512.  
  1513.  st CanSee
  1514.  
  1515.  move.l Points,a2
  1516.  move.w Targetx,d1
  1517.  move.w Targetz,d2
  1518.  sub.w Viewerx,d1
  1519.  sub.w Viewerz,d2
  1520.  
  1521.  moveq #0,d3
  1522.  move.w -6(a0),d3
  1523.  blt nomorerclips
  1524.  move.l LEVELCLIPS,a1
  1525.  lea (a1,d3.l*2),a1
  1526.  move.l a1,clipstocheck
  1527. checklcliploop:
  1528.  tst.w (a1)
  1529.  blt nomorelclips
  1530.  
  1531.  move.w (a1),d0
  1532.  blt.s noleftone
  1533.  move.l (a2,d0.w*4),d3
  1534.  move.w d3,d4
  1535.  sub.w Viewerz,d4
  1536.  swap d3
  1537.  sub.w Viewerx,d3
  1538.  muls d2,d3
  1539.  muls d1,d4
  1540.  sub.l d3,d4
  1541.  ble outlist
  1542.  
  1543. noleftone:
  1544.  
  1545.  addq #2,a1
  1546.  
  1547.  bra checklcliploop
  1548.  
  1549. nomorelclips:
  1550.  
  1551.  addq #2,a1
  1552.  
  1553. checkrcliploop:
  1554.  tst.w (a1)
  1555.  blt nomorerclips
  1556.  
  1557.  move.w (a1),d0
  1558.  blt.s norightone
  1559.  move.l (a2,d0.w*4),d3
  1560.  move.w d3,d4
  1561.  sub.w Viewerz,d4
  1562.  swap d3
  1563.  sub.w Viewerx,d3
  1564.  muls d2,d3
  1565.  muls d1,d4
  1566.  sub.l d3,d4
  1567.  bge outlist
  1568.  
  1569. norightone:
  1570.  addq #2,a1
  1571.  
  1572.  bra checkrcliploop
  1573.  
  1574.  
  1575. nomorerclips:
  1576.  
  1577. ; No clipping points in the way; got to do the
  1578. ; vertical working out now.
  1579.  
  1580.  move.w Targetx,d0
  1581.  move.w Targetz,d1
  1582.  sub.w Viewerx,d0
  1583.  sub.w Viewerz,d1
  1584.  move.l FromRoom,a5
  1585.  move.l FloorLines,a1
  1586.  move.b ViewerTop,d2
  1587.  move.w Targety,d7
  1588.  sub.w Viewery,d7
  1589.  
  1590.  
  1591. GoThroughZones:
  1592.  move.l a5,a0
  1593.  adda.w ToExitList(a0),a0
  1594.  
  1595. FindWayOut:
  1596.  move.w (a0)+,d5
  1597.  blt outlist
  1598.  asl.w #4,d5
  1599.  lea (a1,d5.w),a2
  1600.  
  1601.  move.w (a2),d3
  1602.  move.w 2(a2),d4
  1603.  sub.w Viewerx,d3
  1604.  sub.w Viewerz,d4
  1605.  move.w d3,d5
  1606.  move.w d4,d6
  1607.  muls d1,d3
  1608.  muls d0,d4
  1609.  sub.l d3,d4
  1610.  ble FindWayOut
  1611.  
  1612.  add.w 4(a2),d5
  1613.  add.w 6(a2),d6
  1614.  muls d0,d6
  1615.  muls d1,d5
  1616.  sub.l d5,d6
  1617.  bge FindWayOut
  1618.  
  1619.  tst.w 8(a2)
  1620.  blt outlist
  1621.  
  1622. ; Here is the exit from the room. Calculate the height at which
  1623. ; we meet it.
  1624.  
  1625.  move.w Targetx,d3
  1626.  move.w Targetz,d4
  1627.  sub.w (a2),d3
  1628.  sub.w 2(a2),d4
  1629.  muls 4(a2),d4
  1630.  muls 6(a2),d3
  1631.  sub.l d3,d4    ; positive
  1632.  
  1633.  move.w Viewerx,d5
  1634.  move.w Viewerz,d6
  1635.  sub.w (a2),d5
  1636.  sub.w 2(a2),d6
  1637.  muls 4(a2),d6
  1638.  muls 6(a2),d5
  1639.  sub.l d6,d5    ; positive
  1640.  
  1641.  divs 10(a2),d4
  1642.  divs 10(a2),d5
  1643.  
  1644.  add.w d5,d4
  1645.  beq.s sameheight
  1646.  muls d7,d5
  1647.  divs d4,d5
  1648. sameheight:
  1649.  add.w Viewery,d5    ; height at which we cross wall
  1650.  
  1651.  ext.l d5
  1652.  asl.l #7,d5
  1653.  
  1654.  tst.b d2
  1655.  beq.s comparewithbottom
  1656.  
  1657.  cmp.l ToUpperRoof(a5),d5
  1658.  blt outlist
  1659.  cmp.l ToUpperFloor(a5),d5
  1660.  bgt outlist
  1661.  bra.s madeit
  1662.  
  1663. comparewithbottom:
  1664.  cmp.l ToZoneRoof(a5),d5
  1665.  blt outlist
  1666.  cmp.l ToZoneFloor(a5),d5
  1667.  bgt outlist
  1668. madeit:
  1669.  st donessomething
  1670.  
  1671.  moveq #0,d3
  1672.  move.w 8(a2),d3
  1673.  move.l ZoneAdds,a3
  1674.  move.l (a3,d3.w*4),a5
  1675.  add.l LEVELDATA,a5
  1676.  
  1677.  clr.b d2
  1678.  cmp.l ToZoneFloor(a5),d5
  1679.  bgt outlist
  1680.  cmp.l ToZoneRoof(a5),d5
  1681.  bgt.s GotIn
  1682.  st d2
  1683.  cmp.l ToUpperFloor(a5),d5
  1684.  bgt outlist
  1685.  cmp.l ToUpperRoof(a5),d5
  1686.  blt outlist
  1687.  
  1688. GotIn:
  1689.  
  1690.  cmp.l ToRoom,a5
  1691.  bne GoThroughZones
  1692.  
  1693.  move.b TargetTop,d3
  1694.  eor.b d2,d3
  1695.  bne outlist
  1696.  
  1697.  
  1698.  movem.l (a7)+,d0-d7/a0-a6
  1699.  rts
  1700.  
  1701. clipstocheck: dc.l 0
  1702. donessomething: dc.w 0
  1703.  
  1704. outlist:
  1705.  clr.b CanSee
  1706.  movem.l (a7)+,d0-d7/a0-a6
  1707.  rts
  1708.  
  1709.  
  1710. FindCollisionPt:
  1711.  movem.l d0-a7/a0-a6,-(a7)
  1712.  
  1713.  move.w Targetx,d0
  1714.  move.w Targetz,d1
  1715.  sub.w Viewerx,d0
  1716.  sub.w Viewerz,d1
  1717.  move.l FromRoom,a5
  1718.  move.l FloorLines,a1
  1719.  move.b ViewerTop,d2
  1720.  move.w Targety,d7
  1721.  sub.w Viewery,d7
  1722.  
  1723.  
  1724. .GoThroughZones:
  1725.  move.l a5,a0
  1726.  adda.w ToExitList(a0),a0
  1727.  
  1728. .FindWayOut:
  1729.  move.w (a0)+,d5
  1730.  blt outlist
  1731.  asl.w #4,d5
  1732.  lea (a1,d5.w),a2
  1733.  
  1734.  move.w (a2),d3
  1735.  move.w 2(a2),d4
  1736.  sub.w Viewerx,d3
  1737.  sub.w Viewerz,d4
  1738.  move.w d3,d5
  1739.  move.w d4,d6
  1740.  muls d1,d3
  1741.  muls d0,d4
  1742.  sub.l d3,d4
  1743.  ble .FindWayOut
  1744.  
  1745.  add.w 4(a2),d5
  1746.  add.w 6(a2),d6
  1747.  muls d0,d6
  1748.  muls d1,d5
  1749.  sub.l d5,d6
  1750.  bge .FindWayOut
  1751.  
  1752.  
  1753. ; Here is the exit from the room. Calculate the height at which
  1754. ; we meet it.
  1755.  
  1756.  move.w Targetx,d3
  1757.  move.w Targetz,d4
  1758.  sub.w (a2),d3
  1759.  sub.w 2(a2),d4
  1760.  muls 4(a2),d4
  1761.  muls 6(a2),d3
  1762.  sub.l d3,d4    ; positive
  1763.  
  1764.  move.w Viewerx,d5
  1765.  move.w Viewerz,d6
  1766.  sub.w (a2),d5
  1767.  sub.w 2(a2),d6
  1768.  muls 4(a2),d6
  1769.  muls 6(a2),d5
  1770.  sub.l d6,d5    ; positive
  1771.  
  1772.  divs 10(a2),d4
  1773.  divs 10(a2),d5
  1774.  
  1775.  move.w d5,d6
  1776.  add.w d5,d4
  1777.  beq.s .sameheight
  1778.  muls d7,d5
  1779.  divs d4,d5
  1780. .sameheight:
  1781.  add.w Viewery,d5    ; height at which we cross wall
  1782.  
  1783.  ext.l d5
  1784.  asl.l #7,d5
  1785.  
  1786.  moveq #0,d3
  1787.  move.w 8(a2),d3
  1788.  blt foundpt
  1789.  move.l ZoneAdds,a3
  1790.  move.l (a3,d3.w*4),a5
  1791.  add.l LEVELDATA,a5
  1792.  
  1793.  clr.b d2
  1794.  cmp.l ToZoneFloor(a5),d5
  1795.  bgt foundpt
  1796.  cmp.l ToZoneRoof(a5),d5
  1797.  bgt.s .GotIn
  1798.  st d2
  1799.  cmp.l ToUpperFloor(a5),d5
  1800.  bgt foundpt
  1801.  cmp.l ToUpperRoof(a5),d5
  1802.  blt foundpt
  1803.  
  1804. .GotIn:
  1805.  
  1806.  bra .GoThroughZones
  1807.  
  1808.  tst.w d4
  1809.  beq.s foundpt
  1810.  muls d6,d0
  1811.  divs d4,d0
  1812.  muls d6,d1
  1813.  divs d4,d1
  1814.  add.w Viewerx,d0
  1815.  add.w Viewerz,d1
  1816.  move.w d0,Targetx
  1817.  move.w d1,Targetz
  1818.  move.l d5,Targety
  1819.  
  1820. foundpt:
  1821.  
  1822.  movem.l (a7)+,d0-a7/a0-a6
  1823.  rts
  1824.  
  1825. GetRand:
  1826.  move.w Rand1,d0
  1827.  rol.w #3,d0
  1828.  add.w #$2343,d0
  1829.  move.w d0,Rand1
  1830.  rts
  1831.  
  1832. Rand1: dc.w 234
  1833.  
  1834. GoInDirection:
  1835.  move.l #SineTable,a0
  1836.  lea (a0,d0.w),a0
  1837.  move.w (a0),d1
  1838.  move.w 2048(a0),d2
  1839.  muls speed,d1
  1840.  add.l d1,d1
  1841.  muls speed,d2
  1842.  add.l d2,d2
  1843.  swap d1
  1844.  swap d2
  1845.  add.w oldx,d1
  1846.  add.w oldz,d2
  1847.  move.w d1,newx
  1848.  move.w d2,newz
  1849.  rts
  1850.  
  1851. CollideFlags: dc.l 0
  1852.  
  1853. Collision:
  1854.  
  1855.  move.l ObjectData,a0
  1856.  move.w CollId,d0
  1857.  asl.w #6,d0
  1858.  move.b 16(a0,d0.w),d0
  1859.  ext.w d0
  1860.  
  1861.  sub.w #64,a0
  1862.  move.l ObjectPoints,a1
  1863.  move.l #ColBoxTable,a2
  1864.  lea  (a2,d0.w*8),a3
  1865.  
  1866.  move.l CollideFlags,d7
  1867.  move.b StoodInTop,d6
  1868.  move.l newy,d4
  1869.  move.l d4,d5
  1870.  add.l thingheight,d5
  1871.  asr.l #7,d4
  1872.  asr.l #7,d5
  1873.  clr.b hitwall
  1874.  
  1875. checkcol:
  1876.  add.w #64,a0
  1877.  
  1878.  move.w (a0),d0
  1879.  blt checkedallcol
  1880.  
  1881.  cmp.w CollId,d0
  1882.  beq.s checkcol
  1883.  
  1884.  tst.w 12(a0)
  1885.  blt.s checkcol
  1886.  
  1887.  tst.b numlives(a0)
  1888.  beq.s checkcol
  1889.  
  1890.  move.b ObjInTop(a0),d1
  1891.  eor.b d6,d1
  1892.  bne checkcol
  1893.  
  1894.  moveq #0,d3
  1895.  move.b 16(a0),d3
  1896.  blt checkcol
  1897.  beq .ycol
  1898.  
  1899.  cmp.b #1,d3
  1900.  bne checkcol
  1901.  
  1902.  move.l LINKFILE,a4
  1903.  add.l #ObjectStats,a4
  1904.  moveq #0,d1
  1905.  move.b TypeOfThing(a0),d1
  1906.  muls #ObjectStatLen,d1
  1907.  cmp.w #2,O_Behaviour(a4,d1.w)
  1908.  bne checkcol
  1909.  
  1910.  tst.b numlives(a0)
  1911.  ble checkcol
  1912.  
  1913. .ycol
  1914.  
  1915.  btst d3,d7
  1916.  beq checkcol
  1917.  
  1918.  move.w 4(a0),d1
  1919.  sub.w 2(a2,d3.w*8),d1
  1920.  cmp.w d1,d5
  1921.  blt checkcol
  1922.  add.w 4(a2,d3.w*8),d1
  1923.  cmp.w d1,d4
  1924.  bgt checkcol
  1925.  
  1926.  move.w (a1,d0.w*8),d1
  1927.  move.w 4(a1,d0.w*8),d2
  1928.  sub.w newx,d1
  1929.  bge.s .xnoneg
  1930.  neg.w d1
  1931. .xnoneg:
  1932.  sub.w newz,d2
  1933.  bge.s .znoneg
  1934.  neg.w d2
  1935. .znoneg:
  1936.  cmp.w d1,d2
  1937.  ble.s .checkx
  1938.  sub.w (a3),d2
  1939.  cmp.w (a2,d3.w*8),d2
  1940.  bgt checkcol
  1941.  st hitwall
  1942.  bra checkedallcol
  1943. .checkx:
  1944.  sub.w (a3),d1
  1945.  cmp.w (a2,d3.w*8),d1
  1946.  bgt checkcol
  1947.  
  1948.  move.w (a1,d0.w*8),d1
  1949.  move.w 4(a1,d0.w*8),d2
  1950.  move.w d1,d6
  1951.  move.w d2,d7
  1952.  sub.w newx,d6
  1953.  sub.w newz,d7
  1954.  muls d6,d6
  1955.  muls d7,d7
  1956.  add.l d6,d7
  1957.  sub.w oldx,d1
  1958.  sub.w oldz,d2
  1959.  muls d1,d1
  1960.  muls d2,d2
  1961.  add.l d1,d2
  1962.  cmp.l d2,d7
  1963.  bgt checkcol
  1964.  
  1965.  st hitwall
  1966.  bra checkedallcol
  1967.  
  1968. ; bra checkcol
  1969.  
  1970. checkedallcol:
  1971.  rts
  1972.  
  1973. ColBoxTable:
  1974.  
  1975. ; red scurrying alien
  1976.  dc.w 40,60,120,0
  1977. ; Medipack
  1978.  dc.w 40,20,40,0
  1979. ; Bullet
  1980.  dc.w 40,20,40,0
  1981. ; Gun
  1982.  dc.w 40,20,40,0
  1983. ; Key
  1984.  dc.w 40,20,40,0
  1985. ; PLayer1
  1986.  dc.w 40,40,80,0
  1987. ;Robot
  1988.  dc.w 40,50,100,0
  1989. ;?
  1990.  dc.w 40,20,40,0
  1991. ; Flying Nasty
  1992.  dc.w 80,60,120,0
  1993. ; Ammo
  1994.  dc.w 40,20,40,0
  1995. ; Barrel
  1996.  dc.w 40,30,60,0
  1997. ;PlAYER2
  1998.  dc.w 40,40,80,0
  1999. ; Mutant Marine
  2000.  dc.w 40,40,80,0
  2001. ; worm
  2002.  dc.w 80,60,120,0
  2003. ; huge red thing
  2004.  dc.w 160,100,200,0
  2005. ; small red thing
  2006.  dc.w 80,50,100,0
  2007. ; tree
  2008.  dc.w 80,60,120,0
  2009. ; eyeball
  2010.  dc.w 40,30,60,0
  2011. ; Tough Marine
  2012.  dc.w 40,40,80,0
  2013. ; ShotGun Marine
  2014.  dc.w 40,40,80,0
  2015.  
  2016. FromZone: dc.w 0
  2017. OKTEL: dc.w 0
  2018. floortemp: dc.l 0
  2019.  
  2020. CheckTeleport:
  2021.  clr.b OKTEL
  2022.  move.w FromZone,d0
  2023.  move.l ZoneAdds,a2
  2024.  move.l (a2,d0.w*4),a2
  2025.  add.l LEVELDATA,a2
  2026.  tst.w ToTelZone(a2)
  2027.  bge.s ITSATEL
  2028.  rts
  2029.  
  2030. ITSATEL:
  2031.  move.l ToZoneFloor(a2),floortemp
  2032.  move.w ToTelZone(a2),d0
  2033.  move.l ZoneAdds,a3
  2034.  move.l (a3,d0.w*4),a3
  2035.  add.l LEVELDATA,a3
  2036.  move.l ToZoneFloor(a3),d0
  2037.  sub.l floortemp,d0
  2038.  move.l d0,floortemp
  2039.  add.l d0,newy 
  2040.  move.w ToTelX(a2),newx
  2041.  move.w ToTelZ(a2),newz
  2042.  move.l #%1111111111111111111,CollideFlags
  2043.  movem.l a0/a1/a2,-(a7)
  2044.  bsr Collision
  2045.  movem.l (a7)+,a0/a1/a2
  2046.  
  2047.  move.l floortemp,d0
  2048.  sub.l d0,newy
  2049.  
  2050.  tst.b hitwall
  2051.  seq OKTEL
  2052.  beq.s .teleport
  2053.  rts
  2054. .teleport:
  2055.  move.w ToTelZone(a2),d0
  2056.  move.l ZoneAdds,a2
  2057.  move.l (a2,d0.w*4),a2
  2058.  add.l LEVELDATA,a2
  2059.  move.l a2,objroom
  2060.  
  2061.  rts
  2062.  
  2063. FindCloseRoom:
  2064.  ; d0 is distance.
  2065.  
  2066.  move.w 4(a0),d1
  2067.  ext.l d1
  2068.  asl.l #7,d1
  2069.  move.l d1,oldy
  2070.  move.l d1,newy
  2071.  
  2072.  move.w (a0),d1
  2073.  move.l ObjectPoints,a1
  2074.  lea (a1,d1.w*8),a1
  2075.  move.w (a1),oldx 
  2076.  move.w 4(a1),oldz
  2077.  
  2078.  move.w 12(a0),d2
  2079.  move.l ZoneAdds,a5
  2080.  move.l (a5,d2.w*4),d2
  2081.  add.l LEVELDATA,d2
  2082.  move.l d2,objroom
  2083.  
  2084.  move.w THISPLRxoff,newx
  2085.  move.w THISPLRzoff,newz
  2086.  move.w d0,speed
  2087.  movem.l a0/a1,-(a7)
  2088.  jsr HeadTowards
  2089.  movem.l (a7)+,a0/a1
  2090.  
  2091.  move.w newx,d0
  2092.  sub.w oldx,d0
  2093.  move.w oldz,d1
  2094.  sub.w newz,d1
  2095.  
  2096.  move.w d1,xd
  2097.  move.w d0,zd
  2098.  
  2099.  move.l #100000,StepUpVal
  2100.  move.l #100000,StepDownVal
  2101.  move.w #0,thingheight
  2102.  
  2103.  st exitfirst
  2104.  
  2105.  add.w oldx,d1
  2106.  add.w oldz,d0
  2107.  move.w d1,newx
  2108.  move.w d0,newz
  2109.  movem.l d0-d7/a0-a6,-(a7)
  2110.  clr.b wallbounce
  2111.  jsr MoveObject
  2112.  movem.l (a7)+,d0-d7/a0-a6
  2113.  
  2114.  move.l #RoomPath,a2
  2115.  move.l #possclose,a3
  2116.  move.w 12(a0),(a3)+
  2117.  
  2118. putinmore:
  2119.  move.w (a2)+,(a3)+
  2120.  bge.s putinmore
  2121.  subq #2,a3
  2122.  
  2123.  move.w oldx,d0
  2124.  sub.w xd,d0
  2125.  move.w oldz,d1
  2126.  sub.w zd,d1
  2127.  move.w d0,newx
  2128.  move.w d1,newz    
  2129.  
  2130.  movem.l d0-d7/a0-a6,-(a7)
  2131.  clr.b wallbounce
  2132.  jsr MoveObject
  2133.  movem.l (a7)+,d0-d7/a0-a6
  2134.  
  2135.  move.l #RoomPath,a2
  2136.  
  2137. putinmore2:
  2138.  move.w (a2)+,d0
  2139.  move.w d0,(a3)+
  2140.  tst.w d0
  2141.  bge.s putinmore2
  2142.  
  2143. ; ok a3 points at list of rooms passed through.
  2144.  move.w #-1,(a3)+
  2145.  
  2146.  
  2147.  move.w 12(a0),d7
  2148.  
  2149.  move.l endoflist,a3
  2150. FINDCLOSELOOP:
  2151.  move.l #possclose,a2
  2152.  move.w -(a3),d0
  2153.  blt foundclose
  2154.  
  2155. findinner
  2156.  move.w (a2)+,d1
  2157.  blt.s outin
  2158.  cmp.w d0,d1
  2159.  bne.s findinner
  2160.  move.w d0,d7
  2161. outin:
  2162.  
  2163.  bra.s FINDCLOSELOOP
  2164.  
  2165. foundclose:
  2166.  
  2167.  move.w d7,GraphicRoom(a0)
  2168.  
  2169.  rts
  2170.  
  2171. xd: dc.w 0
  2172. zd: dc.w 0
  2173.  
  2174. possclose:
  2175.  ds.w 100